package com.sokobanboxpro.game.managers;

import com.sokobanboxpro.game.exception.ConfigValueNotFoundException;
import com.sokobanboxpro.game.menu.MainMenu;
import com.sokobanboxpro.game.menu.Menu;
import com.sokobanboxpro.game.menu.MenuEnum;
import com.sokobanboxpro.game.menu.SelectLevelMenu;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.SlickException;

/**
 * Управляет приложением в состояние MENU. т.е. когда приложение переходит в
 * сотояние MENU
 *
 * @author Esr
 */
public class MenuManager {

		/**
		 * Текушее меню.
		 */
		private static Menu currentMenu;
		/**
		 * Главное меню.
		 */
		private static MainMenu mainMenu;
		/**
		 * Меню выбора уровней.
		 */
		private static SelectLevelMenu selectLevelMenu;

		/**
		 * Создание. 
		 * Устанавливает также стандартное меню
		 */
		public static void init() throws ConfigValueNotFoundException, SlickException, Exception {

				setCurrentMenu(new MainMenu());
				mainMenu = new MainMenu();
				selectLevelMenu = new SelectLevelMenu();

		}

		/**
		 * Обновление.
		 *
		 * @param gc
		 * @param delta Время прошедшее с предыдушего обновления
		 */
		public static void update(GameContainer gc, int delta) {

				currentMenu.update();

		}

		/**
		 * Нажатие мыши или касание экрана.
		 *
		 * @param x Координата x
		 * @param y Координата y
		 */
		public static void mousePressed(int x, int y) throws Exception {

				currentMenu.mousePressed(x, y);

		}

		/**
		 * Получить текушее меню.
		 *
		 * @return Текушее меню
		 */
		public static Menu getCurrentMenu() {
				return currentMenu;
		}

		/**
		 * Изменить меню.
		 *
		 * @param aCurrectMenu Новое меню
		 */
		private static void setCurrentMenu(Menu aCurrectMenu) {
				currentMenu = aCurrectMenu;
		}

		/**
		 * Сменить меню.
		 * @param menuType Тип меню
		 */
		public static void setMenu(MenuEnum menuType) {

				switch (menuType) {

						case MAIN_MENU:
								currentMenu = mainMenu;
								break;
						case LEVEL_SELECT_MENU:
								currentMenu = selectLevelMenu;
								break;


				}

		}

		/**
		 * Вызывается при смене состояния приложения.
		 */
		public static void changeState() {

				currentMenu.changeState();

		}

}
